/**
 * 模拟请求重试
 * @param {Number} timeout 请求时长
 * @param {Number} times 请求次数
 * @returns 
 */
function request(timeout,times) {
    return new Promise((reslove,reject) => {
        setTimeout(() => {
            if (times < 4) {
                // reslove("请求成功！");
                reject("请求超时！");
            } else {
                reslove("请求成功！");
            }
        },timeout)
    })
}

const arr = [500,1000,1500,2000];

/**
 * 采用瀑布流的方式完成四次重试请求
 */
function method1(callback) {
    let index = 0;
    request(arr[index],++ index)
    .then(res =>{
        console.log(`第${index}次请求成功`);
        callback(res);
        // 瀑布流中，可以返回一个pending状态的Promise对象，跳出瀑布流
        return new Promise(function(){});
    },err=> {
        console.log(`第${index}次请求失败`);
        return request(arr[index],++ index);
    }).then(res =>{
        console.log(`第${index}次请求成功`);
    },err=> {
        console.log(`第${index}次请求失败`);
        return request(arr[index],++ index);
    }).then(res =>{
        console.log(`第${index}次请求成功`);
    },err=> {
        console.log(`第${index}次请求失败`);
        return request(arr[index],++ index);
    }).then(res =>{
        console.log(`第${index}次请求成功`);
    },err=> {
        console.log(`第${index}次请求失败`);
        return request(arr[index],++ index);
    })
    
}

/**
 * 请求重试：异步转同步的方式
 */
async function method2() {
    let result;
    for (let i = 0;i < arr.length;i ++) {
        try {
            result = await request(arr[i],i + 1);
            console.log(`第${i + 1}次请求成功`);
        } catch (e) {
            console.log(`第${i + 1}次请求失败`);
        }
    }
    console.log("得到请求结果：",result);
    return result;
}

// method1(function(res) {
//     console.log("得到请求结果：",res);
// });

let res = method2();
res.then(res => {
    console.log("res =",res);
})